home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
EnigmA Amiga Run 1995 October
/
EnigmA AMIGA RUN 01 (1995)(G.R. Edizioni)(IT)[!][issue 1995-10][Aminet 7].iso
/
Aminet
/
util
/
cli
/
mykinf.lha
/
inf25
/
inf.e
< prev
next >
Wrap
Text File
|
1995-06-24
|
9KB
|
292 lines
/* $VER: Inf.e 2.51 (29.04.95) ©1995 Michael Askin
** A small program to show how much space is left on a volume in
** bytes. This time the program internals are all in bytes.
**
** 2.51 (29.04.95) - Fixed bug if no device name on arg
** Took out spaces in QUIET
** 2.5 (20.03.95) - Added Multiple device names
** (06.04.95) - Only takes first dev name when WIN flag is on.
**
** 2.4 (8.2.95) - Printing numbers with comma's
** - Watch (was seperate program)
** - Window (was seperate program)
** - Font sensitivity
** - Opening on public screens
*/
MODULE 'dos/dos','intuition/intuition','intuition/screens'
CONST BYTESCUTOFF=102400, KBYTESCUTOFF=8192
ENUM ARG_DEVICES,ARG_WB,ARG_BYTE,ARG_KILO,ARG_WATCH,ARG_WINDOW,ARG_SCREEN,ARG_QUIET
ENUM ER_NONE, ER_LOCK, ER_INFO, ER_ARGS, ER_WIN, ER_PUBSCREEN, ER_BREAK
/* Set common errors. Automatically calls the exception handler. */
RAISE ER_LOCK IF Lock()=NIL,
ER_INFO IF Info()=NIL,
ER_WIN IF OpenWindowTagList()=NIL,
ER_PUBSCREEN IF LockPubScreen()=NIL,
ER_BREAK IF CtrlC()=TRUE
DEF info:infodata /* Holds the info about the disk */
DEF args:PTR TO LONG /* Holds the arguments */
DEF ver[150]:STRING
PROC main() HANDLE
DEF lock=0, rdargs=0, win:window, port, scr:screen, screenname[30]:STRING
DEF temp[80]:STRING, device[250]:STRING, watch, window, nodev_flag=FALSE
DEF devices:PTR TO LONG, i=0
DEF argstr[200]:STRING
StrCopy(ver,'$VER:Inf 2.51 (29.04.95) ©1995 Michael Askin',ALL)
StringF(argstr,'\s\nDEVICES/M,WB/S,B=BYTES/S,KB=KILO/S,W=WATCH/S,WIN=WINDOW/S,PS=PUBLICSCREEN/K,QUIET/S',ver+5)
args:=[0,0,0,0,0,0,0,0] ; win:=NIL ; scr:=NIL
/* Do I need the next line? */
/* devices:=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]*/
IF (rdargs:=ReadArgs(argstr,args,NIL))=NIL THEN Raise(ER_ARGS)
IF args[ARG_DEVICES]<>NIL
devices:=args[ARG_DEVICES]
ELSE
devices:=['',0]
ENDIF
IF args[ARG_SCREEN]<>NIL THEN StrCopy(screenname,args[ARG_SCREEN],ALL) ELSE screenname:=NIL
IF args[ARG_WATCH]=TRUE THEN watch:=TRUE ELSE watch:=FALSE
IF args[ARG_WINDOW]=TRUE THEN window:=TRUE
IF wbmessage<>0
window:=TRUE
ELSE
IF (args[ARG_QUIET]=FALSE) AND (args[ARG_WINDOW]=FALSE)
WriteF('\s\n',ver+5)
ENDIF
ENDIF
WHILE (nodev_flag=FALSE)
IF devices[i]<>NIL
StrCopy(device,devices[i],ALL)
ELSEIF (i=0)
StrCopy(device,'',ALL)
nodev_flag:=TRUE
ELSE
/*WriteF('Good Bye\n')*/
Raise(ER_NONE)
ENDIF
INC i
CtrlC()
/* Find actual name of volume */
getdevname(device)
lock:=Lock(device,SHARED_LOCK) /* Lock the disk */
IF window=TRUE
watch:=TRUE
/* Open a window on a pub screen if pos */
scr:=LockPubScreen(screenname)
win:=OpenWindowTagList(0,
[WA_LEFT,640-501,
WA_TOP,0,
WA_WIDTH,500,
WA_HEIGHT,scr.barheight+1,
WA_IDCMP, IDCMP_CLOSEWINDOW+IDCMP_VANILLAKEY,
WA_FLAGS,WFLG_CLOSEGADGET+WFLG_DRAGBAR+WFLG_DEPTHGADGET+WFLG_RMBTRAP,
WA_PUBSCREEN, scr,
0,0])
/* To make sure we don't keep opening more windows for the other */
/* device names we make sure we only look at the first dev on */
/* list, by setting the nodev flag. */
nodev_flag:=TRUE
ELSE
win:=NIL
ENDIF
IF win<>NIL THEN port:=win.userport /* Any port in a storm! */
REPEAT /* So that even if watch=FALSE, we will get 1 trip */
Info(lock,info) /* Get the info */
/* Print the results */
showsize(device,win)
IF (window=TRUE OR args[ARG_WATCH]=TRUE)
Delay(10)
ENDIF
IF CtrlC()=TRUE THEN watch:=FALSE
IF win<>NIL THEN IF GetMsg(port)<>0 THEN watch:=FALSE
UNTIL watch=FALSE
IF win=NIL THEN WriteF('\n')
ENDWHILE
Raise(ER_NONE)
EXCEPT
IF lock THEN UnLock(lock)
IF rdargs THEN FreeArgs(rdargs)
IF win THEN CloseWindow(win)
IF scr THEN UnlockPubScreen(NIL,scr)
SELECT exception
CASE ER_NONE
CASE ER_LOCK ; WriteF('Could not find device "\s"\n',device)
CASE ER_INFO ; WriteF('Could not get info from "\s"\n',device)
CASE ER_ARGS ; WriteF('Bad Args. Inf ? for help\n')
CASE ER_WIN ; WriteF('Could not open window!\n')
CASE ER_PUBSCREEN ; WriteF('Could not find public screen!\n')
CASE ER_BREAK ; WriteF('\n***Break\n')
DEFAULT ; WriteF('Unknown Error \d\n',exception)
ENDSELECT
ENDPROC
PROC showsize(dev,win:PTR TO window)
DEF size, used, free, freeper
DEF sizeunits[8]:STRING, usedunits[8]:STRING, freeunits[8]:STRING
DEF freestring[10]:STRING, usedstring[10]:STRING, sizestring[10]:STRING
DEF output[100]:STRING, diskstate[40]:STRING, ds=0
/* Full size of unit in bytes */
size:=Mul(info.numblocks,info.bytesperblock)
/* Used Bytes */
used:=Mul(info.numblocksused,info.bytesperblock)
/* Amount of free bytes */
free:=size-used
/* Calculate the percentage */
freeper:=percentage(free,size)
IF args[ARG_QUIET]<>TRUE
size:=doconversion(size,sizeunits)
free:=doconversion(free,freeunits)
used:=doconversion(used,usedunits)
ENDIF
commanumber(used,usedstring)
commanumber(free,freestring)
commanumber(size,sizestring)
/* This bit works out just what the diskstate is */
ds:=info.diskstate
SELECT ds
CASE ID_WRITE_PROTECTED ; StrCopy(diskstate,'Write Protected',ALL)
CASE ID_VALIDATING ; StrCopy(diskstate,'Not Validated',ALL)
CASE ID_VALIDATED ; StrCopy(diskstate,'OK',ALL)
ENDSELECT
IF args[ARG_QUIET]<>TRUE
IF args[ARG_WB]=TRUE
StringF(output,'\s \d% full, \s\s free, \s\s in use',dev,100-freeper,freestring,freeunits,usedstring,usedunits)
ELSE
StringF(output,'"\s" {\s\s} = \s\s (\d% full,\d% free) Status:\s',dev,sizestring,sizeunits,freestring,freeunits,100-freeper,freeper,diskstate)
ENDIF
ELSE
StringF(output,'\d',free)
ENDIF
IF win=NIL
WriteF('\s\b',output)
ELSE
SetWindowTitles(win,output,ver+5)
ENDIF
ENDPROC
PROC percentage(amount,full)
DEF ans
ans:=Div(amount,Div(full,100))
IF ans<0 THEN ans:=0
IF ans>100 THEN ans:=100
ENDPROC ans
PROC doconversion(value,units)
DEF bytescut
/* Make it possible to set just Kbs and no other value */
IF args[ARG_KILO]=TRUE THEN bytescut:=0 ELSE bytescut:=BYTESCUTOFF
StrCopy(units,' bytes',ALL)
IF args[ARG_BYTE]<>TRUE
IF value>bytescut
value:=Div(value,1024)
StrCopy(units,'K',ALL)
ENDIF
IF args[ARG_KILO]<>TRUE
IF ((value>KBYTESCUTOFF) AND (units[0]="K"))
value:=Div(value,1024)
StrCopy(units,'M',ALL)
ENDIF
ENDIF
ENDIF
ENDPROC value
/* Gets the root directories name, i.e. the volume name, and places it */
/* in the string specified in the brackets */
PROC getdevname(devname)
DEF lock, oldlock, fib:fileinfoblock
/* If file does not exist, then prehaps it's a device without the */
/* colon (:) */
IF filethere(devname)=FALSE THEN StrAdd(devname,':',ALL)
IF lock:=Lock(devname,SHARED_LOCK)
REPEAT
oldlock:=lock
lock:=ParentDir(oldlock)
Examine(oldlock,fib)
UnLock(oldlock) /* Don't need it any more */
UNTIL lock=NIL
UnLock(lock)
StrCopy(devname,fib.filename,ALL) /* Copy filename to the string */
StrAdd(devname,':',ALL)
ELSE
WriteF('Could not get device name\n')
ENDIF
ENDPROC
/* Convert a number to a string with comma's !!!!!! */
/* Horribly messy code... but it works! */
PROC commanumber(number,string)
DEF out[12]:STRING, temp[12]:STRING,i, j, cc
StringF(temp,'\d',number)
j:=0
cc:=-1 /* Comma Count */
FOR i:=StrLen(temp)-1 TO 0 STEP -1
INC cc
IF cc>=3
cc:=0
out[j]:=","
INC j
ENDIF
out[j]:=temp[i]
INC j
ENDFOR
out[j]:=0 /* Null on the end */
/* Reverse the string again.. */
j:=0
FOR i:=StrLen(out)-1 TO 0 STEP -1
temp[j]:=out[i]
INC j
ENDFOR
temp[j]:=0
StrCopy(string,temp,ALL)
ENDPROC string
PROC filethere(file) HANDLE
DEF lock=0
lock:=Lock(file,ACCESS_READ)
UnLock(lock)
RETURN TRUE
EXCEPT
RETURN FALSE
ENDPROC TRUE